/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package TablasAuxiliares;

import BaseDatos.GestorBD;
import Negocio.ObjetoDatos;
import Util.GestorErrores;
import Util.Varios;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;

/**
 * Clase general que permite gestionar Los hobbies
 */
public class TAHobbies implements ObjetoDatos{
    //Nombre de la tabla de la Base de Datos
    private String _sNombreTabla = "Hobbies";
    //Descripción de la tabla de la Base de Datos
    private String _sDescripTabla = "Hobbies";
    //Condición where
    private String sCondWhere = "";

    //Atributos
    private String _sCodigo;
    private String _sDescripcion;
    private String _sModalidad;
    private String _sCaracter;

    public String getsDescripTabla() {
        return _sDescripTabla;
    }

    public void setsDescripTabla(String _sDescripTabla) {
        this._sDescripTabla = _sDescripTabla;
    }
    
    public void setsCodigo(String _sCodigo) {
        this._sCodigo = _sCodigo;
    }

    public void setsDescripcion(String _sDescripcion) {
        this._sDescripcion = _sDescripcion;
    }

    public void setsNombreTabla(String _sNombreTabla) {
        this._sNombreTabla = _sNombreTabla;
    }

    public String getsCodigo() {
        return _sCodigo;
    }

    public String getsDescripcion() {
        return _sDescripcion;
    }

    public String getsNombreTabla() {
        return _sNombreTabla;
    }

    public String getsCaracter() {
        return _sCaracter;
    }

    public void setsCaracter(String _sCaracter) {
        this._sCaracter = _sCaracter;
    }

    public String getsModalidad() {
        return _sModalidad;
    }

    public void setsModalidad(String _sModalidad) {
        this._sModalidad = _sModalidad;
    }

    /*
     * Recupera todo el contenido de la tabla y lo devuelvo en 2 vectores. Uno con los nombres de los campos y
     * otro vector de vectores con los datos propiamente dichos (cada tupla de datos en un vector). El orden de los
     * campos de la fila es el mismo que el de los nombres de los campos.
     */
    public boolean selectAll ( Vector columnIdentifiers, Vector dataVector){
        String sCondicion = "";
        //Si hay alguna condición se añade a la sentencia
        if (this.sCondWhere.compareTo("") != 0)
            sCondicion = " WHERE " + this.sCondWhere;
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            ResultSet rs = st.executeQuery("SELECT Codigo, Descripcion, Modalidad, Caracter FROM " + this._sNombreTabla + sCondicion + " ORDER BY Codigo");
            ResultSetMetaData metaDatos = rs.getMetaData();
            // Se obtiene el número de columnas.
            int numeroColumnas = metaDatos.getColumnCount();
            // Se obtiene cada una de las etiquetas para cada columna
            for (int i = 0; i < numeroColumnas; i++){
               // Nuevamente, para ResultSetMetaData la primera columna es la 1.
               columnIdentifiers.addElement( metaDatos.getColumnLabel(i + 1) );
            }

            while (rs.next()) {
                // Se crea un vector que será cada fila de la tabla.
                Vector fila = new Vector (numeroColumnas);

                // Se rellena cada posición del vector con una de las columnas de la tabla en base de datos.
                for (int i = 0; i < numeroColumnas; i++)
                    fila.addElement ( rs.getObject(i+1) ); // El primer indice en rs es el 1, no el cero, por eso se suma 1.

                // Se añade al modelo la fila completa.
                dataVector.addElement( fila );
            }
            rs.close();
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Inserta un registro en la entidad auxiliar
     */
    public boolean insert ( ){
        if ( !validar () )
            return false;
        String sSQL = "INSERT INTO " + this._sNombreTabla + " (Codigo, Descripcion, Modalidad, Caracter) VALUES ('" +
            this._sCodigo + "', '" + this._sDescripcion + "', '" + this._sModalidad + "', '" +
            this._sCaracter + "')";
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Actualiza un registro en la entidad auxiliar
     */
    public boolean update ( ){
        if ( !validar () )
            return false;
        String sSQL = "UPDATE " + this._sNombreTabla + " SET Descripcion = '" + this._sDescripcion + "'," +
            "Modalidad = '"+ this._sModalidad + "'," +
            "Caracter = '"+ this._sCaracter + "' " +
            " WHERE Codigo = " + this._sCodigo;
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Borra un registro de la Entidad Auxiliar
     */
    public boolean delete (){
        String sSQL = "DELETE FROM " + this._sNombreTabla + " WHERE " +
            " Codigo = " + this._sCodigo;
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }        
        return false;
    }

    public void inicializa (){
        this._sCodigo = "";
        this._sDescripcion = "";
        this._sModalidad = "";
        this._sCaracter = "";
    }   

    /*
     * Valida los datos de la clase antes de hacer una inserción/actualización.
     * Se informa de los errores que se produzcan mediante un vector de String.
     */
    public boolean validar (){
        if ( this._sCodigo.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El código es obligatorio");
        if ( this._sDescripcion.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("La descripción es obligatoria");
        if ( this._sModalidad.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("La modalidad del hobby es obligatoria");
        if ( this._sCaracter.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El carácter del hobby es obligatorio");
        return (GestorErrores.getInstancia().getvErrores().size () == 0);
    }

//    /*
//     * Carga los atributos de la clase a partir de 2 vectores, uno con los nombres de los campos
//     * y otro con los valores de los mismos. Ambos vectores están asociados a un JTable.
//     */
//    public void vectorJTableAClase ( Vector columnIdentifiers, Vector dataRow ){
//        this._sCodigo = "";
//        this._sDescripcion = "";
//        for (int i=0; i < columnIdentifiers.size(); i++){
//            //Cargo el campo Código
//            if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Codigo") == 0 )
//                this._sCodigo = dataRow.get(i).toString();
//            //Cargo el ampo Descripcion
//            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Descripcion") == 0 )
//                this._sDescripcion = dataRow.get(i).toString();
//        }
//    }

    /*
     * Carga SOLO los atributos que conforman la clave de la clase a partir de 2 vectores,
     * uno con los nombres de los campos
     * y otro con los valores de los mismos.
     */
    public void vectorJTableAClavesClase ( Vector columnIdentifiers, Vector dataRow ){
        this.inicializa();
        int iIndice = Varios.getPosCadena(columnIdentifiers, "Codigo");
        this._sCodigo = dataRow.get(iIndice).toString();
    }

    /*
     * Devuelve un vector cargado con los atributos de la clase para mostrar en el JTable del panel.
     * El orden de los atributos es el indicado
     * en el vector con los nombres de los campos.
     */
    public Vector claseAVectorJTable ( Vector columnIdentifiers ){
        Vector resul = new Vector ();
//        for (int i=0; i < columnIdentifiers.size(); i++){
//            //Cargo el campo Código
//            if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Codigo") == 0 )
//                resul.add( this._sCodigo );
//            //Cargo el campo Descripcion
//            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Descripcion") == 0 )
//                resul.add( this._sDescripcion );
//        }
        return resul;
    }
    /*
     * Este método recupera de la tabla un registro cuya clave primaria están cargados en los
     atributos de la clase correspondientes a la clave. Se recuperan los campos del registro y
     se carga el resto de los atributos de la clase.
     */
    public void recupera (){
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM " + this._sNombreTabla +
                " WHERE Codigo = " + this._sCodigo);
            if ( rs.next() ) {
                this._sCodigo = rs.getString("Codigo");
                this._sDescripcion = rs.getString("Descripcion");
                this._sModalidad = rs.getString("Modalidad");
                this._sCaracter = rs.getString("Caracter");
            }
            rs.close();
            st.close();

        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public String getsCondWhere() {
        return sCondWhere;
    }

    public void setsCondWhere(String sCondWhere) {
        this.sCondWhere = sCondWhere;
    }
}
